package produce.raw;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @author : xiaohong
 * @date : 2021/4/14 13:58
 * 原生代码实现fanout模式
 */

@RestController
@RequestMapping("raw")
public class RawFanoutProduce {

    // 所有的中间件技术都是基于TCP/IP协议基础上构建的协议规范，只不过rabbitmq遵循的是amqp

    @GetMapping
    public void raw() {
        //创建连接工程
        ConnectionFactory connectionFactory  = new ConnectionFactory();

        connectionFactory.setHost("119.29.67.157");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("xiaohong");
        connectionFactory.setPassword("xiaohong");
        connectionFactory.setVirtualHost("my_vhost");


        Connection connection = null;
        Channel channel = null;
        try {
            //创建连接
            connection = connectionFactory.newConnection("生产者");
            // 通过连接获取通道Channel
            channel = connection.createChannel();
            // 通过通道创建交换机，声明队列，交换关系，路由key，发送消息和接受消息
            // 对象名称（）
            String queueName = "raw";
            // 参数1 队列名称 参数2 是否持化 参数3 是否排他性 参数4 是否自动删除 参数5 携带的参数
            channel.queueDeclare(queueName,true,false,false,null);
            //消息内容
            String message = "我是raw测试";
            // 准备交换机
            String exchangeName = "raw_exchange";
            // 指定交换机的类型
            String type = "fanout";
            // 发送消息的queue
            // 参数1 交换机名 参数2 路由key 参数3 消息属性 参数4 消息内容  fanout的路由key为空
            channel.basicPublish(exchangeName,"",null,message.getBytes());

            System.out.println("消息发送成功");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }finally {
            // 关闭通道
            if (channel != null && channel.isOpen()){
                try {
                    channel.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }

            // 关闭连接
            if (connection != null && connection.isOpen()){
                try {
                    connection.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }


    }




}
